package Maps 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import Utils.TextUtils;
	
	/**
	 * ...
	 * @author Serg de Adelantado
	 */
	[Event(name = 'complete', type = "flash.events.Event")]
	public class MapLoader extends Sprite 
	{
		private var FLoader:URLLoader;
		private var FImageLoader:Loader;
		private var FBytesLoader:Loader;
		
		private var FText:TextField;
		private var FForamt:TextFormat;
		private var FParser:MapParser;
		private var FImage:Bitmap;
		
		public function MapLoader() 
		{
			FText = new TextField();
			FForamt = new TextFormat('Calibri', 14, 0x3A76B1);
			FForamt.align = TextFormatAlign.CENTER;
			addChild(FText);
			FText.selectable = false;
			FText.defaultTextFormat = FForamt;
			FText.multiline = true;
			addEventListener(Event.ADDED_TO_STAGE, OnAddedToStage);
			FLoader = new URLLoader();
			FLoader.addEventListener(Event.COMPLETE, OnXMLLoaded);
			FLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityError);
			FLoader.addEventListener(IOErrorEvent.IO_ERROR, OnIOError);
			FParser = new MapParser();			
			FImageLoader = new Loader();			
			FImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, OnImageLoaded);			
			FImageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, OnImageLoading);
			FImageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, OnImageIOError);
		}		
		
		private function OnAddedToStage(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, OnAddedToStage);			
			stage.addEventListener(Event.RESIZE, OnStageResize);
		}
		
		private function OnStageResize(e:Event):void 
		{
			FText.width = stage.stageWidth;
			FText.y = (stage.stageHeight - FText.height) / 2;
		}
		
		//{	XML loading
		public function Load(APath:String):void
		{
			FLoader.load(new URLRequest(APath));
			Text = 'Загрузка информации о карте...';
		}
		
		public function PrintSettingsError():void 
		{
			Text = TextUtils.ColoredString('#931518', 'Не удалось обнаружить файл настроек');
			Text += TextUtils.ColoredString('#931518', 'Секция FlashVars не найдена, поиск файла настроек по текщему URL...');
			Text += TextUtils.ColoredString('#931518', 'Невозможно определить текущий URL, возможно приложение запущено в локальном режиме');
		}
		
		private function OnIOError(e:IOErrorEvent):void 
		{
			Text = TextUtils.ColoredString('#931518', 'При загрузке файла настроек произошла ошибка:');
			Text += TextUtils.ColoredString('#931518', e.text);
		}
		
		private function OnSecurityError(e:SecurityErrorEvent):void 
		{
			Text = TextUtils.ColoredString('#931518', 'При загрузке файла настроек произошла ошибка:');
			Text += TextUtils.ColoredString('#931518', e.text);
		}
		
		private function OnXMLLoaded(e:Event):void 
		{
			FParser.XMLData = XML(e.target.data);
			Text = 'Загрузка фонового изображения...';
			FImageLoader.load(new URLRequest(FParser.MapImageURL));
		}
		
		//}
		
		//{ Image loading 
		
		private function OnImageIOError(e:IOErrorEvent):void 
		{
			Text = TextUtils.ColoredString('#931518', 'При загрузке фонового изображения карты произошла ошибка:');
			Text += TextUtils.ColoredString('#931518', e.text);
		}
		
		private function OnImageLoading(e:ProgressEvent):void 
		{
			Text = 'Загрузка фонового изображения...';
			Text += TextUtils.ColoredString('#1D1E1E', 'Загружено ' + e.bytesLoaded + ' из ' + e.bytesTotal);
		}
		
		private function OnImageLoaded(e:Event):void 
		{
			trace('Image loaded');
			var FBytesLoader:Loader = new Loader();
			FBytesLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, OnImageBytesLoaded);
			FBytesLoader.loadBytes(FImageLoader.contentLoaderInfo.bytes, new LoaderContext(false, ApplicationDomain.currentDomain));			
		}
		
		private function OnImageBytesLoaded(e:Event):void 
		{			
			with(DisplayObject(e.target.content))
				var vCanvas:BitmapData = new BitmapData(width, height);
			vCanvas.draw(DisplayObject(e.target.content));			
			FImage = new Bitmap(vCanvas);			
			dispatchEvent(new Event(Event.COMPLETE));
			ClearLoader(FBytesLoader);
			ClearLoader(FImageLoader);
		}
		
		private function ClearLoader(ALoader:Loader):void 
		{
			ALoader.unloadAndStop();
			if(ALoader.contentLoaderInfo && ALoader.contentLoaderInfo.bytes)
				ALoader.contentLoaderInfo.bytes.clear();
		}
		
		//} End of image loading
		
		public function get Text():String
		{ 
			return FText.htmlText;
		}
		
		public function set Text(AText:String):void 
		{
			FText.height = 0;
			FText.htmlText = AText;
			FText.height = FText.textHeight + 4;
			OnStageResize(null);
		}
		
		public function get Parser():MapParser
		{ 
			return FParser;
		}
		
		public function get Image():Bitmap
		{ 
			return FImage; 
		}
	}
}